package generator.workflow;

import generator.datastructure.WritebleClass;
import generator.util.input_interpreter.ParallelizerInterpreter;



/**Esta clase junto a sus colaboradores permite llevar a cabo el proceso de paralelización de una clase java.
 * Utiliza como colaboradores un {@link ParallelizerInterpreter} que conoce como obtener
 * los métodos a ser paralelizados, un {@link PeerClassDirector} que conoce el
 * mecanismo genérico de transformación de código java secuencial en java paralelizado, un {@link BindingManager}
 * que conoce cómo ligar la clase secuencial con la clase peer que contiene métodos en su versión paralelizada, y
 * un {@link PolicyManager} que conoce cómo el usuario indica la existencia de políticas asociadas a los métodos
 * que desean paralelizarse. * 
 * @author Hirsch-Fernández*/
public class Parallelizer {
	
	/**Objeto que conoce como obtener los métodos a ser gridificados*/
	protected ParallelizerInterpreter parallelizerInterpreter;	
	
	/**Objeto que define los pasos troncales de análisis y transformación de código java
	 * secuencial en código java que hace uso de algún middleware específico*/
	protected PeerClassDirector peerClassDirector;

	protected BindingManager bindingManager;
	
	protected PolicyManager policyManager;
	
	
	/**Constructor vacío de la clase*/
	public Parallelizer(){
		
	}
	
	/**@return Instancia del objeto que conoce cómo el usuario indica la existencia de políticas asociadas
	 * a los métodos que se desean paralelizar.*/
	public PolicyManager getPolicyManager() {
		return policyManager;
	}

	/**@param policyManager
	 * 			instancia del objeto que conoce cómo el usuario indica la existencia de políticas asociadas
	 * a los métodos que se desean paralelizar.*/
	public void setPolicyManager(PolicyManager policyManager) {
		this.policyManager = policyManager;
	}

	/**@return Retorna la instancia del objeto que realiza la ligadura entre el método a paralelizar de la
	 * clase secuencial y el método paralelizado de la clase Peer*/
	public BindingManager getBindingManager() {
		return bindingManager;
	}

	/**@param bindingManager 
	 * 			Instancia del objeto que realiza la ligadura entre el método a paralelizar de la
	 * clase secuencial y el método paralelizado de la clase Peer*/
	public void setBindingManager(BindingManager bindingManager) {
		this.bindingManager = bindingManager;
	}
	
	/**@return retorna la instancia del objeto que guía y ejecuta el análisis y transformación
	 * de código del proceso de paralelización*/
	public PeerClassDirector getPeerClassDirector() {
		return peerClassDirector;
	}
	
	/**@param peerClassDirector
	 * 			instancia del objeto que que guía y ejecuta el análisis y transformación
	 * de código del proceso de paralelización*/
	public void setPeerClassDirector(PeerClassDirector peerClassDirector) {
		this.peerClassDirector = peerClassDirector;
	}

	
	/**@return retorna la instancia del objeto que conoce cómo obtener los métodos
	 * que el usuario desea paralelizar*/
	public ParallelizerInterpreter getParallelizerInterpreter() {
		return parallelizerInterpreter;
	}

	/**@param parallelizerInterpreter
	 * 			la instancia del objeto que conoce cómo obtener los métodos que el usuario desea paralelizar*/
	public void setParallelizerInterpreter(ParallelizerInterpreter parallelizerInterpreter) {
		this.parallelizerInterpreter = parallelizerInterpreter;
	}
	
		
	/**Este es el método que constituye el punto de entrada al proceso de transformación de una aplicación
	 * java secuencial que permite obtener la versión paralelizada de la misma. 
	 * */
	public void parallelizeApplication(){		
				
		peerClassDirector.buildPeerClass();
		WritebleClass peerClass = peerClassDirector.getPeerClassBuilder().getPeerClass();		
		policyManager.addPolicyMechanism(peerClass);
		peerClass = policyManager.getPeerWithPolicies();
		
		WritebleClass bindedClass = bindingManager.bindPeerClass();
		
		peerClass.export(parallelizerInterpreter.getClassToParallelizeContentDirectory());
		bindedClass.export(parallelizerInterpreter.getClassToParallelizeContentDirectory());		
		
	}	
}
